﻿

namespace Acoris.Content
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Diagnostics;
    using System.Text;    
    using Acoris.Document;

    /// <summary>
    /// 表示记事本
    /// </summary>
    [DebuggerDisplay("count:{Count}")]
    public sealed class NoteBook: NamedObject,ICollection<Page>,IEnumerable<Page>
    {
        internal ObservableCollection<Page> m_pageCollection;

        // 在NoteBook中的      m_globalResourceDictionary  为全局级别的资源字典
        // 用于存储全局字典中全部的资源类型，为全局资源提供索引、读取、保存、编辑的功能
        // 在AMLDocument中的   m_resourceDictionary        为文档级别的资源字典
        // 用于保存当前文档使用的资源类型
        internal ResourceDictionary m_globalResourceDictionary;
        internal object m_lock;

        /// <summary>
        /// 初始化记事本
        /// </summary>
        /// <param name="factory">用于加载、保存资源的资源工厂</param>
        internal NoteBook(IContentResourceFactory factory)
        {
            m_pageCollection = new ObservableCollection<Page>();
            m_globalResourceDictionary = new ResourceDictionary(factory);
            m_lock = new object();
        }
        
        #region ICollection<Page>接口成员

        /// <summary>
        /// 获取当前集合的元素个数
        /// </summary>
        public int Count {
            get { return m_pageCollection.Count; }
        }
        
        /// <summary>
        /// 获取一个值,该值指示当前集合的只读性
        /// </summary>
        public bool IsReadOnly {
            get { return false; }
        }

        /// <summary>
        /// 将指定内容页添加到集合之中
        /// </summary>
        /// <param name="item">要添加的对象</param>
        public void Add(Page item)
        {
            lock (m_lock) {
                m_pageCollection.Add(item);
            }
        }

        /// <summary>
        /// 清空当前集合
        /// </summary>
        public void Clear()
        {
            lock (m_lock) {
                m_pageCollection.Clear();
            }
        }

        /// <summary>
        /// 获取一个值，该值指示指定的元素是否存在与当前集合
        /// </summary>
        /// <param name="item">要比较的对象</param>
        /// <returns>如果指定的对象存在于当前集合之中则返回true，否则返回false</returns>
        public bool Contains(Page item)
        {
            return m_pageCollection.Contains(item);
        }

        /// <summary>
        /// 将当前集合的元素复制到指定的数组
        /// </summary>
        /// <param name="array">目标数组</param>
        /// <param name="arrayIndex">复制操作在目标数组的起始位置</param>
        public void CopyTo(Page[] array, int arrayIndex)
        {
            lock (m_lock) {
                m_pageCollection.CopyTo(array, arrayIndex);
            }
        }

        /// <summary>
        /// 删除集合中的指定元素
        /// </summary>
        /// <param name="item">要删除的对象</param>
        /// <returns>如果删除成功则返回true，否则返回false</returns>
        public bool Remove(Page item)
        {
            var result = false;
            lock (m_lock) {
                result = m_pageCollection.Remove(item);
            }
            return result;
        }

        #endregion

        #region IEnumerable<Page>接口成员

        /// <summary>
        /// 获取用于当前对象的枚举数
        /// </summary>
        /// <returns>返回用于当前对象的枚举数</returns>
        public IEnumerator<Page> GetEnumerator()
        {
            return ((IEnumerable<Page>)this.m_pageCollection).GetEnumerator();
        }

        

        /// <summary>
        /// 获取用于当前对象的枚举数
        /// </summary>
        /// <returns>返回用于当前对象的枚举数</returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable<Page>)this.m_pageCollection).GetEnumerator();
        }

        #endregion

        #region Override

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return this.Name;
        }

        #endregion
    }
}
